Linux开发

推荐列表 站点导航

当前位置:首页 > 服务器技术 > Linux开发 >

将socket程序从linux移植到windows上

来源:网络整理  作者:  发布时间:2020-12-22 22:09
今天突然想试下纯socket编程在两个系统上代码重合量有多大,只要不使用VC自定义的宏(比如SOCKET、SOCKADDR等等)感觉...

今天突然想试下纯socket编程在两个系统上代码重合量有多大,只要不使用VC自定义的宏(比如SOCKET、SOCKADDR等等)感觉代码重合量挺大的。

 

比如最简单的TCP客户端和服务端对话,在VC中用int取代SOCKET宏,用struct sockaddr_in取代SOCKADDR_IN宏。

 

然后区别就仅仅是头文件和windows额外加载/关闭套接字库的代码了。

 

// Unix/Linux<br>#include <sys/socket.h>

#include <netinet/in.h> // sockaddr_in

#include <arpa/inet.h>  // inet_pton

int main(int argc, char* argv[])

{

// TODO: 通用代码

}

 

// Windows

#include <WinSock2.h>

#include <WS2tcpip.h>

#pragma comment(lib, "Ws2_32.lib")

// windows上不直接支持close关闭文件描述符

#define close closesocket

// windows上需要额外加载和关闭socket库

#define LOAD_WIN_SOCK_LIB \

WSAData wsaData; \

if (WSAStartup(MAKEWORD(2, 1), &wsaData) != 0) \

err_quit("加载windows套接字库失败!"); \

if (LOBYTE(wsaData.wVersion) != 2 || \

HIBYTE(wsaData.wVersion) != 1) \

{ \

WSACleanup(); \

err_quit("版本号初始化失败"); \

}

#define CLOSE_WIN_SOCK_LIB WSACleanup();

int main()

{

LOAD_WIN_SOCK_LIB

// TODO: 通用代码

CLOSE_WIN_SOCK_LIB

}

 

上述两份代码忽略了其他头文件,全局变量的定义和最后的return 0;

 

err_quit是我直接用APUE的错误处理函数,换成fprintf+exit也可以。

 

如果只需要一份文件就使用跨平台宏定义了

 

#ifdef WIN32

// TODO: WINDOWS平台的特定代码

#else

// TODO: LINUX平台的特定代码

#endif

 

说到底在windows上写只为了交作业,而且windows还提供了CAsyncSocket和CSocket等等,没必要执着于跨平台。

相关热词: windows Linux

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/server/kaifa/7523.shtml

相关文章
Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

将socket程序从linux移植到windows上

2020-12-22 编辑:

今天突然想试下纯socket编程在两个系统上代码重合量有多大,只要不使用VC自定义的宏(比如SOCKET、SOCKADDR等等)感觉代码重合量挺大的。

 

比如最简单的TCP客户端和服务端对话,在VC中用int取代SOCKET宏,用struct sockaddr_in取代SOCKADDR_IN宏。

 

然后区别就仅仅是头文件和windows额外加载/关闭套接字库的代码了。

 

// Unix/Linux<br>#include <sys/socket.h>

#include <netinet/in.h> // sockaddr_in

#include <arpa/inet.h>  // inet_pton

int main(int argc, char* argv[])

{

// TODO: 通用代码

}

 

// Windows

#include <WinSock2.h>

#include <WS2tcpip.h>

#pragma comment(lib, "Ws2_32.lib")

// windows上不直接支持close关闭文件描述符

#define close closesocket

// windows上需要额外加载和关闭socket库

#define LOAD_WIN_SOCK_LIB \

WSAData wsaData; \

if (WSAStartup(MAKEWORD(2, 1), &wsaData) != 0) \

err_quit("加载windows套接字库失败!"); \

if (LOBYTE(wsaData.wVersion) != 2 || \

HIBYTE(wsaData.wVersion) != 1) \

{ \

WSACleanup(); \

err_quit("版本号初始化失败"); \

}

#define CLOSE_WIN_SOCK_LIB WSACleanup();

int main()

{

LOAD_WIN_SOCK_LIB

// TODO: 通用代码

CLOSE_WIN_SOCK_LIB

}

 

上述两份代码忽略了其他头文件,全局变量的定义和最后的return 0;

 

err_quit是我直接用APUE的错误处理函数,换成fprintf+exit也可以。

 

如果只需要一份文件就使用跨平台宏定义了

 

#ifdef WIN32

// TODO: WINDOWS平台的特定代码

#else

// TODO: LINUX平台的特定代码

#endif

 

说到底在windows上写只为了交作业,而且windows还提供了CAsyncSocket和CSocket等等,没必要执着于跨平台。

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/server/kaifa/7523.shtml

相关文章

风云图片

推荐阅读

返回Linux开发频道首页